#include <stdio.h>

/**
 * 给定100个人站成一圈，从第1个人开始依次报数。
 * 每数到3的人将会被淘汰，然后继续从下一个人开始报数。
 * 这个过程会一直持续，直到所有的人都被淘汰。
 * 请编写一个C语言程序来模拟这个过程，并且输出每一个被淘汰人的编号。
 * 要求：输出每一个被淘汰人的编号，每淘汰一个人输出一行，格式为："%d out \n"(每输出一次换行)
*/

#define ALL_NUM    	100 
#define COUNT_NUM	3
#define OUT_NUM		3

/* people id array such as (1,2,3,4,5,6) */
int people[ALL_NUM];

int main(void)
{
	int left;	/* 剩余人数 */
	int pos;	/* 当前报数位置 */
	int step;	/* 当前报数 */

	//初始化约瑟夫环
	for(int i=0;i<100;i++){
	  people[i]=i+1;
	}
	
	//初始化变量
	left=100;
	pos=0;
	step=0;

	while(left>1){
	  step++;

	  //如果报数到3则在数组中删除
	  if(step==3){
	    printf("%d out \n",people[pos]);
	    //数组移动操作
	    for(int i=pos;i<left-1;++i){
	      people[i]=people[i+1];
	    }
	    step=0;
	    left--;
	    pos--;
	  }
	  pos++;

	  //遍历完成则重置索引重新开始
	  if(pos==left){
	    pos=0;
	  }
	}
        printf("%d out \n",people[0]);	
	return 0;
}
